let arr = [1,2,3]
let iterator = arr[Symbol.iterator]()
console.log(iterator.next()) // {value: 1, done: false}
console.log(iterator.next()) // {value: 1, done: false}
console.log(iterator.next()) // {value: 1, done: false}
console.log(iterator.next()) // {value: 1, done: false}

class Iterator {
    constructor(arr){
        this._array = arr
        this._cursor = 0
    }
    next(){
        return this._cursor < this._array.length ? {value: this._array[this._cursor++],done: false}: {value: undefined,done: true}
    }
}
// 虽然很简单，但是可以用来做延迟
let test = new Iterator(arr)
console.log('test',test.next()) // {value: 1, done: false}
console.log('test',test.next()) // {value: 1, done: false}
console.log('test',test.next()) // {value: 1, done: false}
console.log('test',test.next()) // {value: 1, done: false}
// 订阅一个 Observable 就像是执行一个 function
// 延迟运算 == promise.then ？
// Observable 其实就是这两个 Pattern（模式） 思想的结合，Observable 具备生产者推送资料的特性，同时能像序列，拥有序列处理资料的方法(map, filter...)！

// 更简单的来说，Observable 就像是一个序列，里面的元素会随着时间推送。
// 可以链式操作 既能 push（消息来了能自己推送） 也能 pull （next）
// 另外三个重点分别是

// Observer(观察者)
// Subject(订阅者)
// Schedulers(操作符)


// RxJS是一个流式编程库，它提供了一种方便的方式来处理异步和事件驱动的程序。RxJS的实现原理涉及到一些复杂的概念，包括观察者模式、可观察对象（Observables）、观察者（Observers）、操作符（Operators）等。

// 核心概念包括：

// Observable（可观察对象）：Observable是一个表示数据流的对象，它可以发出一系列的值（数据项），可以是同步的，也可以是异步的。Observable可以被订阅，一旦被订阅，它就可以发出值。
// Observer（观察者）：Observer是一组回调函数的集合，用于接收Observable发出的值。Observer可以有三种回调函数：next用于接收正常的值，error用于接收错误，complete用于接收完成通知。
// Subscription（订阅）：订阅表示Observable执行的实际工作，通常包括生成值、执行副作用和清理资源等。当订阅一个Observable时，会返回一个Subscription对象，它可以用来取消订阅。
// Operators（操作符）：操作符是用于处理Observable的工具函数，可以用于转换、筛选、合并等操作Observable的数据流。
// RxJS的实现基于这些核心概念，它使用观察者模式来实现数据流的处理和传递。当Observable发出值时，会通知观察者，观察者接收到值后可以对其进行处理，然后传递给下一个观察者或者执行其他操作。

// RxJS还提供了丰富的操作符和工具函数，用于处理各种数据流操作，包括映射、筛选、合并、转换等。这些操作符可以被链式调用，形成一个流式的数据处理管道。

// 总的来说，RxJS的实现原理基于观察者模式和流式编程的理念，通过Observable、Observer、Subscription和Operators等核心概念来实现数据流的处理和传递

